﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 依赖倒置原则
{
    /// <summary>
    /// 所谓依赖倒置原则（Dependence Inversion Principle）就是要依赖于抽象，不要依赖于具体。设计模式之依赖注入.简单的说就是要求对抽象进行编程，不要对实现进行编程，这样就降低了调用者与实现模块间的耦合。
    /// 实现开闭原则的关键是抽象化，并且从抽象化导出具体化实现，如果说开闭原则是面向对象设计的目标的话，那么依赖倒转原则就是面向对象设计的主要手段。 from：百度百科
    /// </summary>
    public class Class1
    {

        //油车启动-具体实现代码
        private void func1()
        {
            var engine = new PetrolEngine();
            var car = new Car(engine) { };
            car.StartCar();
        }

        //电车启动-具体实现代码
        private void func2()
        {
            var engine = new ElectricEngine();
            var car = new Car(engine) { };
            car.StartCar();
        }

    }

    //定义接口
    public interface IEngine
    {
        void Start();  //定义某个函数的空实现
    }

    //实现接口
    public class PetrolEngine : IEngine
    {
        //重写接口中对应函数的具体实现代码
        public void Start() => MessageBox.Show("油车发动机启动, Petrol engine started.");
    }

    public class ElectricEngine : IEngine
    {
        //重写接口中对应函数的具体实现代码
        public void Start() => MessageBox.Show("电车发动机启动, Electric engine started.");
    }


    /// <summary>
    /// 依赖注入案例
    /// </summary>
    public class Car
    {
        private readonly IEngine _engine;

        public Car(IEngine engine)   //通过构造函数注入依赖项
        {
            this._engine = engine;
        }

        public void StartCar()
        {
            _engine.Start();
            MessageBox.Show("Car started.");
        }
    }

}
